/**
 * 绘制三维圆柱区域，并对圆心进行标注和添加圆点
 * @param {Object} viewer - Cesium Viewer 对象，用于在场景中添加实体。
 * @param {Number} lon - 圆心的经度。
 * @param {Number} lat - 圆心的纬度。
 * @param {Number} minHeight - 圆柱的底部高度。
 * @param {Number} maxHeight - 圆柱的顶部高度。
 * @param {Number} radius - 圆柱的半径。
 * @param {String} color - 圆柱的颜色。
 * @param {Number} alpha - 圆柱的透明度。
 * @returns {Object} - 返回绘制的实体。
 */
export function drawCylinderAreaM1(viewer, lon, lat, minHeight, maxHeight, radius, color, alpha = 0.5, text = "起降场") {
  const height = maxHeight - minHeight; // 计算圆柱的高度

  const entity = viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(lon, lat, minHeight + height / 2), // 圆柱体中心位置
    cylinder: {
      length: height,
      topRadius: radius,
      bottomRadius: radius,
      material: Cesium.Color[color.toUpperCase()].withAlpha(alpha),
      outline: true, // 是否显示轮廓
      outlineColor: Cesium.Color[color.toUpperCase()], // 轮廓颜色
      outlineWidth: 1 // 轮廓线宽
    },
  });

  viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(lon, lat, maxHeight + 10), // 圆柱体中心位置
    label: {
      text: text, // 根据需要替换为对应的标签内容
      font: '20px sans-serif',
      fillColor: Cesium.Color.WHITE,
      style: Cesium.LabelStyle.FILL_AND_OUTLINE,
      outlineWidth: 2,
      outlineColor: Cesium.Color.BLACK,
      verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
      heightReference: Cesium.HeightReference.NONE,
      scaleByDistance: new Cesium.NearFarScalar(1.5e2, 1.5, 1.0e7, 0.5),
      disableDepthTestDistance: Number.POSITIVE_INFINITY,
      distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 4000.0) // 可见距离为 0 到 3000 米
    }
  });

  return entity; // 返回绘制的实体
}



/**
 * 绘制三维轨迹长方体走廊边框（模拟飞行路径，宽度可变），并添加点标注
 * @param {Object} viewer - Cesium Viewer 对象，用于在场景中添加实体。
 * @param {Array} positions - 包含每个点的经纬度和高度 [lon1, lat1, alt1, lon2, lat2, alt2, ...]。
 * @param {Array} sizes - 每段的长宽高数组 [[width1, height1], [width2, height2], ...]。
 * @param {Number} alpha - 透明度
 * @param {String} color - 管道的颜色。
 * @param {String} text - 中间点标注文本。
 * @param {Array} pointNames - 每个点的名称，用于标注。
 * @param {String} cornerType - 管道拐角处的类型（默认使用圆角）。
 * @returns {Array} - 返回所有绘制的实体数组。
 */
export function draw3DRectangularPipelineTrackM1_2(viewer, positions, sizes, alpha, color = 'YELLOW', text = '航线标签', pointNames = [], cornerType = Cesium.CornerType.ROUNDED) {
  const cartesianPositions = [];
  let minHeight = Infinity;
  let maxHeight = -Infinity;

  // 转换坐标点并计算整体的最小和最大高度
  for (let i = 0; i < positions.length; i += 3) {
    const lon = positions[i];
    const lat = positions[i + 1];
    const alt = positions[i + 2];
    const position = Cesium.Cartesian3.fromDegrees(lon, lat, alt);
    cartesianPositions.push(position);
    // minHeight = Math.min(minHeight, alt);
    maxHeight = Math.max(maxHeight, alt);
  }

  minHeight = maxHeight - sizes[0][1]; // 整体高度减去最低高度

  const overallWidth = Math.max(...sizes.map(size => size[0])); // 选择最大的宽度
  const overallHeight = maxHeight - minHeight; // 总体高度

  // 创建整体走廊边框
  const corridorEntity = viewer.entities.add({
    corridor: {
      positions: cartesianPositions, // 使用所有点作为走廊路径
      width: overallWidth, // 使用最大宽度
      height: minHeight, // 从最低高度开始
      extrudedHeight: maxHeight, // 到达最高高度
      material: Cesium.Color[color.toUpperCase()].withAlpha(alpha), // 设置颜色和透明度
      cornerType: cornerType, // 拐角类型
      outline: true, // 显示轮廓
      outlineColor: Cesium.Color[color.toUpperCase()], // 轮廓颜色
      outlineWidth: 1, // 轮廓线宽
    }
  });

  const entities = [corridorEntity];

  // 标注中间点
  if (text) {
    const middleIndex = Math.floor((cartesianPositions.length - 1) / 2);
    const midPoint = Cesium.Cartesian3.add(cartesianPositions[middleIndex], cartesianPositions[middleIndex + 1], new Cesium.Cartesian3());
    Cesium.Cartesian3.multiplyByScalar(midPoint, 0.5, midPoint);

    const entity = viewer.entities.add({
      position: Cesium.Cartesian3.add(midPoint, new Cesium.Cartesian3(0, 0, overallHeight / 2), new Cesium.Cartesian3()),
      label: {
        text: text, // 标签内容
        font: '20px sans-serif',
        fillColor: Cesium.Color.WHITE,
        style: Cesium.LabelStyle.FILL_AND_OUTLINE,
        outlineWidth: 2,
        outlineColor: Cesium.Color.BLACK,
        verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
        heightReference: Cesium.HeightReference.NONE,
        scaleByDistance: new Cesium.NearFarScalar(1.5e2, 1.5, 1.0e7, 0.5),
        disableDepthTestDistance: Number.POSITIVE_INFINITY,
        distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 4000.0) // 可见距离为 0 到 3000 米
      }
    });
    entities.push(entity);
  }

  // 对每个点添加标注
  pointNames.forEach((name, i) => {
    if (name) {
      const entity = viewer.entities.add({
        position: cartesianPositions[i],
        label: {
          text: name,
          font: '20px sans-serif',
          fillColor: Cesium.Color.WHITE,
          style: Cesium.LabelStyle.FILL_AND_OUTLINE,
          outlineWidth: 2,
          outlineColor: Cesium.Color.BLACK,
          verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
          heightReference: Cesium.HeightReference.NONE,
          scaleByDistance: new Cesium.NearFarScalar(1.5e2, 1.5, 1.0e7, 0.5),
          disableDepthTestDistance: Number.POSITIVE_INFINITY,
          distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 4000.0) // 可见距离为 0 到 3000 米
        }
      });
      entities.push(entity);
    }
  });

  return entities;
}





/**
 * 绘制三维多边形柱状体，并对每个顶点进行标注
 * @param {Object} viewer - Cesium Viewer 对象，用于在场景中添加实体。
 * @param {Array} positions - 包含每个顶点的经纬度 [lon1, lat1, lon2, lat2, ...]。
 * @param {Number} minHeight - 柱状体的底部高度。
 * @param {Number} maxHeight - 柱状体的顶部高度。
 * @param {String} color - 柱状体的颜色。
 * @param {Number} alpha - 柱状体的透明度（默认值为 0.5）。
 * @param {Array} pointNames - 每个顶点的名称，用于标注。
 * @returns {Object} - 返回绘制的实体。
 */
export function draw3DPolygonalPrismM1(viewer, positions, minHeight, maxHeight, color = 'BLUE', alpha = 0.5, text = '区域标签', pointNames = []) {
  const cartesianPositions = [];
  for (let i = 0; i < positions.length; i += 2) {
    const position = Cesium.Cartesian3.fromDegrees(positions[i], positions[i + 1], minHeight);
    cartesianPositions.push(position);
  }

  const height = maxHeight - minHeight;

  // 添加实体，绘制多边形柱状体
  const entity = viewer.entities.add({
    polygon: {
      hierarchy: {
        positions: cartesianPositions
      },
      extrudedHeight: maxHeight,
      height: minHeight,
      material: Cesium.Color[color.toUpperCase()].withAlpha(alpha), // 柱状体颜色
      outline: true, // 是否显示轮廓
      outlineColor: Cesium.Color[color.toUpperCase()], // 轮廓颜色
      outlineWidth: 1 // 轮廓线宽
    }
  });

  // 计算多边形的中心点
  const center = calculatePolygonCenter(cartesianPositions);

  viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(center.longitude, center.latitude, maxHeight + 10), // 高度比 maxHeight 高10米，确保标签显眼
    label: {
      text: text, // 标签文本
      font: '20pt sans-serif',
      fillColor: Cesium.Color.WHITE,
      style: Cesium.LabelStyle.FILL_AND_OUTLINE,
      outlineWidth: 2,
      outlineColor: Cesium.Color.BLACK,
      verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 标签底部与点对齐
      heightReference: Cesium.HeightReference.NONE, // 高度不受地形影响
      distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 4000.0) // 可见距离为 0 到 3000 米
    }
  });

  return entity; // 返回绘制的实体
}

// 计算多边形中心点的函数
function calculatePolygonCenter(positions) {
  let longitudeSum = 0;
  let latitudeSum = 0;
  const count = positions.length;

  for (let i = 0; i < count; i++) {
    const cartesian = positions[i];
    const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
    longitudeSum += Cesium.Math.toDegrees(cartographic.longitude);
    latitudeSum += Cesium.Math.toDegrees(cartographic.latitude);
  }

  return {
    longitude: longitudeSum / count,
    latitude: latitudeSum / count
  };
}
